function triStruct = complete_info(triangles, vertices)
    % 功能：完善新的三角划分信息
    % 输入：
    %   triangles：n×3矩阵，每行表示一个三角形，包含3个顶点编号
    %   vertices：m×2或m×3矩阵，每行表示一个顶点的坐标
    % 输出：
    %   triStruct：结构体数组，每个元素代表一个三角形，包含：
    %       - vertices：三角形的三个顶点编号
    %       - neighbors：三个邻居三角形编号，0表示边界
    %       - coordinates：三个顶点的坐标
    
    % 检查输入有效性
    if size(triangles, 2) ~= 3
        error('三角形矩阵必须是n×3的矩阵');
    end
    if size(vertices, 2) < 2 || size(vertices, 2) > 3
        error('顶点坐标矩阵必须是m×2或m×3的矩阵');
    end
    
    % 获取三角形数量
    nTri = size(triangles, 1);
    
    % 初始化结构体数组
    triStruct(nTri) = struct('vertices', [], 'neighbors', [], 'coordinates', []);
    
    % 创建边到三角形的映射
    edgeMap = containers.Map();
    
    % 首先遍历所有三角形，记录每条边属于哪个三角形
    for i = 1:nTri
        % 当前三角形的三个顶点
        v1 = triangles(i, 1);
        v2 = triangles(i, 2);
        v3 = triangles(i, 3);
        
        % 定义三条边，每条边用排序后的顶点编号表示，确保边(1,2)和(2,1)被视为同一条边
        edge1 = sort([v1, v2]);
        edge2 = sort([v1, v3]);
        edge3 = sort([v2, v3]);
        
        % 将边存储为字符串键，便于在Map中查找
        key1 = sprintf('%d,%d', edge1(1), edge1(2));
        key2 = sprintf('%d,%d', edge2(1), edge2(2));
        key3 = sprintf('%d,%d', edge3(1), edge3(2));
        
        % 将三角形索引添加到边映射中
        if isKey(edgeMap, key1)
            edgeMap(key1) = [edgeMap(key1), i];
        else
            edgeMap(key1) = i;
        end
        
        if isKey(edgeMap, key2)
            edgeMap(key2) = [edgeMap(key2), i];
        else
            edgeMap(key2) = i;
        end
        
        if isKey(edgeMap, key3)
            edgeMap(key3) = [edgeMap(key3), i];
        else
            edgeMap(key3) = i;
        end
        
        % 存储顶点信息到结构体
        triStruct(i).vertices = [v1, v2, v3];
        triStruct(i).coordinates = [vertices(v1,:); vertices(v2,:); vertices(v3,:)];
    end
    
    % 再次遍历所有三角形，确定每个边的邻居
    for i = 1:nTri
        % 当前三角形的三个顶点
        v1 = triangles(i, 1);
        v2 = triangles(i, 2);
        v3 = triangles(i, 3);
        
        % 定义三条边
        edge1 = sort([v1, v2]);
        edge2 = sort([v1, v3]);
        edge3 = sort([v2, v3]);
        
        % 边的键
        key1 = sprintf('%d,%d', edge1(1), edge1(2));
        key2 = sprintf('%d,%d', edge2(1), edge2(2));
        key3 = sprintf('%d,%d', edge3(1), edge3(2));
        
        % 查找邻居
        neighbors = zeros(1, 3);
        
        % 边1的邻居
        triIndices = edgeMap(key1);
        if length(triIndices) == 2
            % 找到另一个三角形
            neighbors(nei_map(1)) = triIndices(triIndices ~= i);
        else
            % 边界边
            neighbors(nei_map(1)) = 0;
        end
        
        % 边2的邻居
        triIndices = edgeMap(key2);
        if length(triIndices) == 2
            neighbors(nei_map(2)) = triIndices(triIndices ~= i);
        else
            neighbors(nei_map(2)) = 0;
        end
        
        % 边3的邻居
        triIndices = edgeMap(key3);
        if length(triIndices) == 2
            neighbors(nei_map(3)) = triIndices(triIndices ~= i);
        else
            neighbors(nei_map(3)) = 0;
        end
        
        % 存储邻居信息
        triStruct(i).neighbors = neighbors;
    end
end

function index = nei_map(side)
switch side
    case 1
        index = 3;
    case 2
        index = 2;
    case 3
        index = 1;
end
end